Passed
Push — development ( e131c7...d0a4d7 )
by Peter
05:27 queued 13s
created

ZonesController.getZonesByCity   B

Complexity

Conditions 1

Size

Total Lines 46
Code Lines 37

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 1.125

Importance

Changes 0
Metric Value
cc 1
eloc 37
dl 0
loc 46
ccs 1
cts 2
cp 0.5
crap 1.125
rs 8.9919
c 0
b 0
f 0
1 2
import { Controller, Get, Param, Query } from '@nestjs/common';
2 2
import {
3
  ApiBearerAuth,
4
  ApiOperation,
5
  ApiResponse,
6
  ApiTags,
7
  ApiParam,
8
  ApiQuery,
9
} from '@nestjs/swagger';
10
// import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard';
11 2
import { ZonesService } from './zones.service';
12 2
import { ZoneFilterQueryDto } from './dto/zone-filter-query.dto';
13
import { ZoneResponse } from './types/ZoneResponse';
14
import { ZoneQuery } from './types/ZoneQuery';
15
16
@ApiTags('Zones')
17
@Controller('zone')
18 2
export class ZonesController {
19 2
  constructor(private readonly zonesService: ZonesService) {}
20
  @Get()
21
  // @ApiBearerAuth()
22
  @ApiOperation({ summary: 'Get all zones' })
23
  @ApiQuery({ name: 'lat', required: false, type: Number })
24
  @ApiQuery({ name: 'lon', required: false, type: Number })
25
  @ApiQuery({
26
    name: 'type',
27
    required: false,
28
    enum: ['parking', 'charging', 'speed'],
29
  })
30
  @ApiQuery({ name: 'includes', required: false, enum: ['bikes'] })
31
  @ApiQuery({
32
    name: 'city',
33
    required: false,
34
    enum: ['Göteborg', 'Jönköping', 'Karlshamn'],
35
  })
36
  @ApiQuery({ name: 'rad', required: false, type: Number })
37
  @ApiResponse({
38
    status: 200,
39
    description: 'List of zones',
40
    schema: {
41
      type: 'array',
42
      example: [
43
        {
44
          id: 'b1e77dd3-9fb9-4e6c-a5c6-b6fc58f59464',
45
          polygon: [
46
            { lat: 59.3293, lng: 18.0686 },
47
            { lat: 59.3294, lng: 18.0687 },
48
            { lat: 59.3295, lng: 18.0688 },
49
          ],
50
          type: 'speed',
51
          city: 'Göteborg',
52
          speedZone: {
53
            id: 'c2f88dd4-0ba9-5f7c-b5d7-c7fc59f59465',
54
            speedLimit: 20.5,
55
          },
56
        },
57
        {
58
          id: 'd2a77ee5-0fa9-4e7c-a6d7-b7fc59f59466',
59
          polygon: [
60
            { lat: 59.8586, lng: 17.6389 },
61
            { lat: 59.8587, lng: 17.639 },
62
            { lat: 59.8588, lng: 17.6391 },
63
          ],
64
          type: 'parking',
65
          city: 'Göteborg',
66
        },
67
      ],
68
    },
69
  })
70
  @ApiResponse({
71
    status: 401,
72
    description: 'Unauthorized. Authentication required',
73
  })
74 2
  async getAllZones(@Query() query: ZoneFilterQueryDto): Promise<ZoneResponse> {
75 2
    const filters: ZoneQuery = {
76
      lat: query.lat ? query.lat : null,
77
      lon: query.lon ? query.lon : null,
78
      type: query.type ? (query.type.split(',') as ('parking' | 'charging' | 'speed')[]) : [],
79
      includes: query.includes ? (query.includes.split(',') as 'bikes'[]) : [],
80
      city: query.city ? (query.city.split(',') as ('Göteborg' | 'Jönköping' | 'Karlshamn')[]) : [],
81
      rad: query.rad ? query.rad : null,
82
    };
83
84 2
    const zones = await this.zonesService.getZonesByFilter(filters);
85
    return {
86
      filters: filters,
87
      ...zones,
88
    };
89
  }
90
91
  @Get('city/:cityName')
92
  @ApiBearerAuth()
93
  @ApiOperation({ summary: 'Get all zones in a specific city' })
94
  @ApiResponse({
95
    status: 200,
96
    description: 'List of zones in the specified city',
97
    schema: {
98
      type: 'array',
99
      example: [
100
        {
101
          id: 'b1e77dd3-9fb9-4e6c-a5c6-b6fc58f59464',
102
          polygon: [
103
            { lat: 59.3293, lng: 18.0686 },
104
            { lat: 59.3294, lng: 18.0687 },
105
            { lat: 59.3295, lng: 18.0688 },
106
          ],
107
          type: 'speed',
108
          city: {
109
            id: 'd2322ff3-a81c-4b06-b78d-1bc72b4fe459',
110
            name: 'Göteborg',
111
            latitude: null,
112
            longitude: null,
113
            createdAt: '2024-12-17T10:37:25.000Z',
114
            updatedAt: '2024-12-17T10:37:25.000Z',
115
          },
116
          speedZone: {
117
            id: 'c2f88dd4-0ba9-5f7c-b5d7-c7fc59f59465',
118
            speedLimit: 20.5,
119
          },
120
        },
121
      ],
122
    },
123
  })
124
  @ApiResponse({
125
    status: 401,
126
    description: 'Unauthorized. Authentication required',
127
  })
128
  @ApiParam({
129
    name: 'cityName',
130
    description: 'Name of the city',
131
    type: 'string',
132
    enum: ['Göteborg', 'Jönköping', 'Karlshamn'],
133
  })
134 2
  async getZonesByCity(@Param('cityName') cityName: 'Göteborg' | 'Jönköping' | 'Karlshamn') {
135
    return await this.zonesService.findByCity(cityName);
136
  }
137
}
138